package com.atguigu.unsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * java.util.ConcurrentModificationException
 *
 * @author sx
 * @date 2022-02-19 10:05
 */
public class ListTest {
    public static void main(String[] args) {
        /**
         * List<String> list = new ArrayList<>();
         * 并发下 ArrayList 不安全
         * 解决方案：
         * 1. List<String> list = new Vector<>();
         * 2. List<String> list = Collections.synchronizedList(new ArrayList<>());
         * 3. List<String> list = new CopyOnWriteArrayList<>();
         */
        /**
         * CopyOnWrite 写入时复制  程序设计领域的一种优化策略
         * 多线程调用，读取的时候固定，写入时会被覆盖
         * 在写入时避免覆盖，造成数据问题
         * 读写分离
         */

        //CopyOnWriteArrayList 相较于 Vector 的优势
        /**
         * Vector的add()用的synchronized，只要有synchronized修饰，效率就较低
         * CopyOnWriteArrayList的add()用的Lock锁
         */
        List<String> list = new CopyOnWriteArrayList<>();

        for (int i = 0; i <= 10; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 5));
                System.out.println(list);
            }, String.valueOf(i)).start();
        }
    }
}
